package com.taldh.jvm.gc;

import java.util.LinkedList;

public class TLABTest {

    public static final LinkedList<String> strings = new LinkedList<>();

    /**
     * 启动参数如下：
     * -Xmx128m -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTLAB -XX:+UnlockExperimentalVMOptions -XX:G1LogLevel=finest
     */
    public static void main(String[] args) throws InterruptedException {
        int iteration = 0;
        while (true) {
            for (int i = 0; i < 100; i++) {
                for (int j = 0; j < 10; j++) {
                    strings.add(new String("String " + j));
                }
            }
            Thread.sleep(100);
        }
    }

    // (young)TLAB: gc thread: 0x00000000176a4000 [id: 13800] desired_size: 450KB slow allocs: 0  refill waste: 7208B alloc: 0.99999    22528KB refills: 1 waste 99.9% gc: 461048B slow: 0B fast: 0B
    // TLAB: gc thread: 0x0000000017639800 [id: 10744] desired_size: 450KB slow allocs: 0  refill waste: 7208B alloc: 0.99999    22528KB refills: 1 waste 35.9% gc: 165520B slow: 0B fast: 0B
    // TLAB: gc thread: 0x0000000016ccd000 [id: 8368] desired_size: 450KB slow allocs: 0  refill waste: 7208B alloc: 0.99999    22528KB refills: 5 waste  2.3% gc: 48040B slow: 5960B fast: 0B
    // TLAB: gc thread: 0x00000000027e9000 [id: 768] desired_size: 450KB slow allocs: 1  refill waste: 7208B alloc: 0.99999    22528KB refills: 79 waste  0.0% gc: 0B slow: 17664B fast: 0B
    // TLAB totals: thrds: 4  refills: 86 max: 79 slow allocs: 1 max 1 waste:  1.8% gc: 674608B max: 461048B slow: 23624B max: 17664B fast: 0B max: 0B

    // 上图表示有4个线程，每个线程都有自己的TLAB，然后就是每个线程都有自己的gc情况，已经最后有一个总的gc情况说明
    // desired_size: 表示期盼的TLAB大小，这个就是TLABSize，可以由-XX:TLABWasteTargetPercent ，-XX:TLABSize=1m，-XX:TLABRefillWasteFraction等等计算得来。
    // slow allocs: 为TLAB之中发生慢分配的次数。
    // refill waste: 为申请一个新的TLAB的阈值
    // alloc： 为线程在堆分配的比例
    // refills：refill发生的次数，就是申请新的TLAB发送的次数
    // waste 表示TLAB有百分之多少的空间浪费了 由三部分组成：
    //     gc: 发送gc的时候，还没有使用的TLAB的空间
    //     slow: 产生新的TLAB时，旧的TLAB浪费的空间
    //     fast: 在快速TLAB分配知州，发生申请TLAB的时候，旧的TLAB浪费的空间

    // 最后的总结：
    //   thrds: 4 表示有4个线程
    //   refills： 86 表示所有线程申请新TLAB的次数
    //
}
